package cn.lil.dao;

import cn.lil.model.User;
import cn.lil.utils.DataSourceUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.SQLException;
import java.util.List;

public class UserDao {

    public User selectByUsernamePassword(String username, String password) throws SQLException {
        QueryRunner r = new QueryRunner(DataSourceUtils.getDataSource());
        String sql = "select u.id,u.username,u.password,u.address,u.phone_number AS phoneNumber from users u where u.username=? and u.password=?";
        return r.query(sql, new BeanHandler<User>(User.class), username, password);
    }

    public List<User> getAllUsers() throws SQLException {
        String sql = "SELECT * FROM users";
        QueryRunner r = new QueryRunner(DataSourceUtils.getDataSource());
        return r.query(sql, new BeanListHandler<>(User.class));
    }

    public boolean isUsernameExists(String username) throws SQLException {
        QueryRunner r = new QueryRunner(DataSourceUtils.getDataSource());
        String sql = "SELECT COUNT(*) FROM users WHERE username = ?";

        // 使用ScalarHandler来获取单个值（这里是COUNT(*)的结果）
        Number count = r.query(sql, new ScalarHandler<>(), username);

        // 如果count大于0，则表示用户名存在
        return count.intValue() > 0;
    }

    public void addUser(User user) throws SQLException {
        QueryRunner r = new QueryRunner(DataSourceUtils.getDataSource());
        String sql = "INSERT INTO users (username, password, email) VALUES (?, ?, ?)";

        // 使用update方法执行插入操作
        // 注意：这里不需要返回结果集，所以我们不需要BeanHandler或其他结果集处理器
        int rowsAffected = r.update(sql, user.getUsername(), user.getPassword(), user.getEmail());

        // 通常，我们可以检查受影响的行数来确认操作是否成功
        // 如果rowsAffected > 0，则表示至少插入了一条记录
        if (rowsAffected > 0) {
            // 操作成功，可以在这里添加日志或其他逻辑
            System.out.println("用户添加成功！");
        } else {
            // 操作失败，可以在这里处理错误或添加日志
            System.out.println("用户添加失败！");
        }
    }

    public void deleteUser(int userId) throws SQLException {
        QueryRunner r = new QueryRunner(DataSourceUtils.getDataSource());
        String sql = "DELETE FROM users WHERE id = ?";

        // 使用update方法执行删除操作
        // 注意：这里不需要返回结果集，所以我们不需要BeanHandler或其他结果集处理器
        int rowsAffected = r.update(sql, userId);

        // 通常，我们可以检查受影响的行数来确认操作是否成功
        // 如果rowsAffected > 0，则表示至少删除了一条记录
        if (rowsAffected > 0) {
            // 操作成功，可以在这里添加日志或其他逻辑
            System.out.println("用户删除成功！");
        } else {
            // 如果没有行受到影响，则可能表示没有找到要删除的用户
            // 操作失败，可以在这里处理错误或添加日志
            System.out.println("用户删除失败，未找到ID为 " + userId + " 的用户！");
        }
    }
    public User selectUserById(int id) throws SQLException {
        QueryRunner queryRunner = new QueryRunner(DataSourceUtils.getDataSource());
        String sql = "SELECT * FROM users WHERE id = ?";

        // 使用 BeanListHandler 来自动将结果集映射到 User 对象列表
        // 假设我们期望只有一个用户匹配给定的 ID，因此可以安全地获取列表中的第一个元素
        List<User> users = queryRunner.query(sql, new BeanListHandler<>(User.class), id);

        // 检查列表是否为空，避免 NullPointerException
        if (users.isEmpty()) {
            return null; // 或者抛出一个异常，表示没有找到用户
        }

        // 返回匹配的用户对象
        return users.get(0);
    }

    public void updateUser(User user) throws SQLException {
        QueryRunner r = new QueryRunner(DataSourceUtils.getDataSource());
        System.out.println("dao"+user);
        String sql = "UPDATE users SET username = ?,password=?, email = ? WHERE id = ?";

        // 使用update方法执行更新操作
        // 注意：这里不需要返回结果集，所以我们不需要BeanHandler或其他结果集处理器
        int rowsAffected = r.update(sql, user.getUsername(),user.getPassword(), user.getEmail(), user.getId());

        // 通常，我们可以检查受影响的行数来确认操作是否成功
        // 如果rowsAffected > 0，则表示至少更新了一条记录
        if (rowsAffected > 0) {
            // 操作成功，可以在这里添加日志或其他逻辑
            System.out.println("用户更新成功！");
        } else {
            // 如果没有行受到影响，则可能表示没有找到要更新的用户
            // 操作失败，可以在这里处理错误或添加日志
            System.out.println("用户更新失败，未找到ID为 " + user.getId() + " 的用户！");
        }
    }

    // 额外：如果你需要验证更新前后的用户数据，你可以使用select语句和BeanHandler来获取用户数据
    // 例如，在更新之前获取用户数据以进行比较：
    public User getUserById(int userId) throws SQLException {
        QueryRunner r = new QueryRunner(DataSourceUtils.getDataSource());
        String sql = "SELECT id, name, email FROM users WHERE id = ?";

        // 使用BeanHandler将结果集映射到User对象
        return r.query(sql, new BeanHandler<>(User.class), userId);
    }
}
